package com.cskaoyan.java._0introduction;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 异常的定义:
 * 异常的概念，早在数组时，我们已经给出：
 * 异常，指的是程序运行时出现的不正常的情况
 *      一般情况下异常会导致程序运行报错，程序终止执行。
 * 异常要和编译报错区分开，相信大家学到今天早已不会再混淆，这里不再赘述。
 *
 * Java异常的体系:
 * 祖先类: Throwable类
 * 该类有两个分支子类: Error和Exception
 * Error是严重错误,程序本身不应该处理,一般也无法处理,该问题应该由程序员通过排查外部环境等手段解决,不是学习的重点.
 *
 *下面我们重点学习Exception的细分两大类：
 *      1.运行时异常，RuntimeException
 *          运行时异常，正如它的名字一样，指的是在程序运行期间，发生的一般问题。
 *          运行时异常指的是:
 *          RuntimeException以及RuntimeException的所有子类，在Java当中，它们被称为运行时异常。
 *          运行时异常有什么特点呢?
 *          1.运行时异常所描述的问题，程序无法在编译时期检查和预料，必须等到程序运行后才可能出现这个问题。
 *
 *          2.表现在代码上就是：即便程序中有可能抛出运行时异常，但不做任何处理时程序也能正常编译和启动。
 *          典型的运行时异常:
 *          ArithmeticException,NullPointerException,ArrayIndexOutOfBoundsException等
 *
 *      2.编译时异常，受检查的异常，CheckedException
 *          所有Exception的非RuntimeException子类,它们都是编译时异常
 *          注意:
 *          Exception是Java运行时异常和编译时异常的父类,在Java代码中它也被当成一个编译时异常处理
 *          编译时时异常有什么特点呢?
 *          编译时异常如果可能在代码中产生,会强制程序员写代码处理该异常,否则不能通过编译,代码无法执行.
 *
 *          典型的编译时异常:
 *          克隆不支持异常（CloneNotSupportedException）以及解析异常（ParseException）等
 *
 * 不管是编译时异常,还是运行时异常,不管在编译时期会不会处理该异常
 * 异常对象本身是不会影响异常的抛出以及处理等
 * 异常到底会不会被抛出,要看代码的执行结果.
 *
 * @since 14:26
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException, ParseException {
        // System.out.println(10 / 0);
        int[] arr = null;
        // arr = new int[0];
        // System.out.println(arr.length);
        // System.out.println(arr[0]);

        Student s = new Student();
        // Unhandled exception: java.lang.CloneNotSupportedException
        s.clone();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        // Unhandled exception: java.text.ParseException
        Date date = sdf.parse("2000-11-22");
    }
}

class Student implements Cloneable {
    @Override
    protected Student clone() throws CloneNotSupportedException {
        return (Student) super.clone();
    }
}
